#define GE_MESSAGE_NONE 0
#define GE_MESSAGE_QUIT 1
#define GE_MESSAGE_INIT 2
#define GE_MESSAGE_CLOSE 3
#define GE_MESSAGE_CONTINUE 4
#define GE_MESSAGE_PAUSE 5
#define GE_MESSAGE_REDRAW 6
#define GE_MESSAGE_RESIZE 7
#define GE_MESSAGE_MOUSE_MOVE 8
#define GE_MESSAGE_MOUSE_BUTTON 9
#define GE_MESSAGE_MOUSE_WHEEL 10
#define GE_MESSAGE_KEY 11
#define GE_MESSAGE_CHAR 12
#define GE_MESSAGE_ON_FRAME 13

//! Cтруктура соощения
struct Message {
	
	//! Тип сообщения
	unsigned int type;

	//! Тело сообщения
	union{
		int as_int[2];
		short as_short[4];
		char as_char[8];
		float as_float[2];
		void* as_void[2];
	}value;
	
	//! Конструктор
	Message();
	
	//! Конструктор без данных
	Message(int mtype);
	
	//! Конструктор с указателем
	Message(int mtype, void* ptr);
	
	//! Конструктор с одним значением int
	Message(int mtype, int v);
	
	//! Конструктор с двумя значениями int
	Message(int mtype, int v0, int v1);
	
};

Message::Message(){
}

Message::Message(int mtype){
	type = mtype;
}

Message::Message(int mtype, void* ptr){
	type = mtype;
	value.as_void[0] = ptr;
}

Message::Message(int mtype, int v){
	type = mtype;
	value.as_int[0] = v;
}

Message::Message(int mtype, int v0, int v1){
	type = mtype;
	value.as_int[0] = v0;
	value.as_int[1] = v1;
}